home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Extra 1996 #3 / AmigaPlus_CD-ROM-EXTRA_Nr.3.bin / aminet-spiele / zwei spieler / lordofhosts / lohsrc.lzh / disk.c < prev    next >
C/C++ Source or Header  |  1991-05-10  |  8KB  |  256 lines

  1. /* LORD OF HOSTS - disk.c --- Lade- und Speicherroutinen */
  2.  
  3. #include "Lord.h"
  4.  
  5. struct FileRequester MyFileReqStruct;
  6. char filename[FCHARS+1];
  7. char directoryname[DSIZE+1];
  8. char load[] = "Select game to load";
  9. char save[] = "Save game as...";
  10. char testplayers[2][16];
  11. FILE *MyFile;
  12. UBYTE testfval[16][8][8],testkval[16][8][8];
  13. int testundopos,testundobot,testredotop,teststatus;
  14. struct Piece testpieces[16];
  15. struct Move testmoves[MAXUNDO];
  16. extern struct Piece ThePieces[16];
  17. extern UBYTE fval[16][8][8];
  18. extern UBYTE kval[16][8][8];
  19. extern UBYTE whatsonboard[8][8];
  20. extern struct Move Moves[MAXUNDO];
  21. extern int undopos, undobot, redotop, status, last_error;
  22. extern int NumPieces[2];
  23. extern char players[2][16];
  24. extern BOOL joymouse_on, joymouse_allowed;
  25.  
  26. void FileError(int Error)
  27. {
  28.    switch(Error)
  29.    {
  30.       case ENOENT:
  31.          SimpleRequest("No such file or directory !");
  32.          break;
  33.       case EBADF:
  34.          SimpleRequest("Bad file descriptor !");
  35.          break;
  36.       case ENOMEM:
  37.          SimpleRequest("Not enough memory !");
  38.          break;
  39.       case ENFILE:
  40.          SimpleRequest("Too many open files in the system !");
  41.          break;
  42.       case EACCES:
  43.          SimpleRequest("Permission denied !");
  44.          break;
  45.       case EIO:
  46.          SimpleRequest("I/O error (use another disk) !");
  47.          break;
  48.       case ENOSPC:
  49.          SimpleRequest("Disk full !");
  50.          break;
  51.       case EROFS:
  52.          SimpleRequest("Read Only file system !");
  53.          break;
  54.       case EAGAIN:
  55.          SimpleRequest("File is empty !");
  56.          break;
  57.       default:
  58.          SimpleRequest("Disk error !");
  59.          break;
  60.    }
  61. }
  62.  
  63. BOOL checkrange(int Var, int lo, int hi)
  64. {
  65.    if (Var>=lo && Var<=hi) return TRUE;
  66.    return FALSE;
  67. }
  68.  
  69. void SaveGame(void)
  70. {
  71.    char filearray[DSIZE+FCHARS+2];
  72.    int intsize=sizeof(int);
  73.    int p,i,j;
  74.    BOOL abort=FALSE;
  75.    filearray[0] = 0;
  76.    MyFileReqStruct.Title = save;
  77.    MyFileReqStruct.PathName = filearray;  /* gesamter Pfad */
  78.    MyFileReqStruct.Dir = directoryname;   /* Verzeichnis */
  79.    MyFileReqStruct.File = filename;       /* File */
  80.    MyFileReqStruct.Flags = FRQCACHINGM|FRQSAVINGM;
  81.    MyFileReqStruct.dirnamescolor = 2;     /* andere Farben für Verzeichnisse */
  82.    MyFileReqStruct.devicenamescolor = 2; /* und Devices */
  83.    if (FileRequester(&MyFileReqStruct))
  84.    {
  85.       MyFile = fopen((const char *)filearray,"rb");
  86.       if (MyFile)
  87.       {
  88.          fclose(MyFile);
  89.          if (!TwoGadRequest("File already exists.\nOverwrite?"))
  90.             return;
  91.       }
  92.       MyFile = fopen((const char *)filearray,"wb");
  93.       if (!MyFile)
  94.       {
  95.          FileError(errno);
  96.          return;
  97.       }
  98.       fwrite(&undopos,intsize,1,MyFile);
  99.       if (!ferror(MyFile)) fwrite(&undobot,intsize,1,MyFile);
  100.       if (!ferror(MyFile)) fwrite(&redotop,intsize,1,MyFile);
  101.       if (!ferror(MyFile)) fwrite(&status,intsize,1,MyFile);
  102.       if (!ferror(MyFile)) fwrite(players,1,32,MyFile);
  103.       if (!ferror(MyFile))
  104.          for (p=0; p<=15; ++p)
  105.          {
  106.             fwrite(&ThePieces[p],sizeof(struct Piece),1,MyFile);
  107.             for (i=0; i<=7; ++i)
  108.                for (j=0; j<=7; ++j)
  109.                   if (!ferror(MyFile))
  110.                   {
  111.                      fputc(fval[p][i][j],MyFile);
  112.                      fputc(kval[p][i][j],MyFile);
  113.                   }
  114.          }
  115.       if (!ferror(MyFile))
  116.          for (i=0; i<MAXUNDO && abort == FALSE; ++i)
  117.             if (!ferror(MyFile))
  118.             {
  119.                fwrite(&Moves[i],sizeof(struct Move),1,MyFile);
  120.                if (Moves[i].fromx+Moves[i].fromy+Moves[i].tox+Moves[i].toy==0)
  121.                   abort = TRUE;
  122.             }
  123.       if (ferror(MyFile)) FileError(errno);
  124.       fclose(MyFile);
  125.    }
  126. }
  127.  
  128. void LoadGame(void)
  129. {
  130.    char filearray[DSIZE+FCHARS+2];
  131.    int intsize=sizeof(int);
  132.    int p,i,j,c;
  133.    BOOL abort=FALSE;
  134.    filearray[0] = 0;
  135.    MyFileReqStruct.Title = load;
  136.    MyFileReqStruct.PathName = filearray;  /* gesamter Pfad */
  137.    MyFileReqStruct.Dir = directoryname;   /* Verzeichnis */
  138.    MyFileReqStruct.File = filename;       /* File */
  139.    MyFileReqStruct.Flags = FRQCACHINGM|FRQLOADINGM;
  140.    MyFileReqStruct.dirnamescolor = 2;     /* andere Farben für Verzeichnisse */
  141.    MyFileReqStruct.devicenamescolor = 2; /* und Devices */
  142.    if (FileRequester(&MyFileReqStruct))
  143.    {
  144.       MyFile = fopen((const char *)filearray,"rb");
  145.       if (!MyFile)
  146.       {
  147.          FileError(errno);
  148.          return;
  149.       }
  150.       fread(&testundopos,intsize,1,MyFile);
  151.       if (!(ferror(MyFile) || feof(MyFile))) fread(&testundobot,intsize,1,MyFile);
  152.       if (!(ferror(MyFile) || feof(MyFile))) fread(&testredotop,intsize,1,MyFile);
  153.       if (!(ferror(MyFile) || feof(MyFile))) fread(&teststatus,intsize,1,MyFile);
  154.       if (!(ferror(MyFile) || feof(MyFile))) fread(testplayers,1,32,MyFile);
  155.       if (!(ferror(MyFile) || feof(MyFile)))
  156.          for (p=0; p<=15; ++p)
  157.          {
  158.             fread(&testpieces[p],sizeof(struct Piece),1,MyFile);
  159.             for (i=0; i<=7; ++i)
  160.                for (j=0; j<=7; ++j)
  161.                   if (!(ferror(MyFile) || feof(MyFile)))
  162.                   {
  163.                      testfval[p][i][j]= fgetc(MyFile);
  164.                      testkval[p][i][j]= fgetc(MyFile);
  165.                   }
  166.          }
  167.       if (!(ferror(MyFile) || feof(MyFile)))
  168.          for (c=0; c<MAXUNDO && abort == FALSE; ++c)
  169.             if (!(ferror(MyFile) || feof(MyFile)))
  170.             {
  171.                fread(&testmoves[c],sizeof(struct Move),1,MyFile);
  172.                if (testmoves[c].fromx+testmoves[c].fromy+
  173.                    testmoves[c].tox+testmoves[c].toy==0)
  174.                   abort = TRUE;
  175.             }
  176.       if (feof(MyFile))
  177.       {
  178.          SimpleRequest("Not a Lord Of Hosts Game File!\nFile too short!");
  179.          fclose(MyFile);
  180.          return;
  181.       }
  182.       if (ferror(MyFile))
  183.       {
  184.          FileError(errno);
  185.          fclose(MyFile);
  186.          return;
  187.       }
  188.       fclose(MyFile);
  189.       if (!checkrange(testundopos,0,MAXUNDO-1) ||
  190.           !checkrange(testundobot,0,MAXUNDO-1) ||
  191.           !checkrange(testredotop,0,MAXUNDO-1))
  192.       {
  193.          SimpleRequest("Not a Lord Of Hosts Game File!\nIllegal Undo/Redo data!");
  194.          return;
  195.       }
  196.       abort = FALSE;
  197.       for (p=0; p<=15 && abort == FALSE; ++p)
  198.          for (i=0; i<=7 && abort == FALSE; ++i)
  199.             for (j=0; j<=7 && abort == FALSE; ++j)
  200.                if (!checkrange(testfval[p][i][j],0,7) ||
  201.                    !checkrange(testkval[p][i][j],0,7))
  202.                   abort = TRUE;
  203.       if (abort)
  204.       {
  205.          SimpleRequest("Not a Lord OF Hosts Game File!\nBad values!");
  206.          return;
  207.       }
  208.       for (i=0; i<=c && abort == FALSE; ++i)
  209.          if (!checkrange(testmoves[i].fromx,0,7) ||
  210.              !checkrange(testmoves[i].fromy,0,7) ||
  211.              !checkrange(testmoves[i].tox,0,7) ||
  212.              !checkrange(testmoves[i].toy,0,7))
  213.             abort = TRUE;
  214.       if (abort)
  215.       {
  216.          SimpleRequest("Not a Lord Of Hosts Game File! Bad moves!");
  217.          return;
  218.       }
  219.       /* File scheint OK, wenn er bis hierhin gekommen ist */
  220.       clear_board();
  221.       drawboard();
  222.       undopos=testundopos;
  223.       undobot=testundobot;
  224.       redotop=testredotop;
  225.       status =teststatus;
  226.       strcpy(players[0],testplayers[0]);
  227.       strcpy(players[1],testplayers[1]);
  228.       drawplayers(players[0],players[1]);
  229.       for (i=0; i<=c; ++i)
  230.          Moves[i] = testmoves[i];
  231.       NumPieces[0]=NumPieces[1]=0;
  232.       for (p=0; p<=15; ++p)
  233.       {
  234.          for (i=0; i<=7; ++i)
  235.             for (j=0; j<=7; ++j)
  236.             {
  237.                fval[p][i][j] = testfval[p][i][j];
  238.                kval[p][i][j] = testkval[p][i][j];
  239.             }
  240.          ThePieces[p]=testpieces[p];
  241.          if (ThePieces[p].StillAlive)
  242.          {
  243.             NumPieces[(p>7)]++;
  244.             whatsonboard[ThePieces[p].x][ThePieces[p].y] = p;
  245.             SetPiece(ThePieces[p],FALSE,FALSE);
  246.          }
  247.       }
  248.       if (status & PLAYER1_TO_MOVE)
  249.       {
  250.          NextPlayer(RED);
  251.       }
  252.       else NextPlayer(WHITE);
  253.       last_error = 0;
  254.    }
  255. }
  256.